package util;

/**
 * Pacote de Utilidade que serão usadas em todo o Projeto
 * @author Claudio Cardoso, Daniel Leite, Lucas Sampaio, Matheus Sampaio
 * @version 1.0
 */

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;

import exception.ExceptionData;
import exception.ExceptionEmail;
import exception.ExceptionGol;
import exception.ExceptionNaturalidade;
import exception.ExceptionSenha;

public class Input {
	
	/**
	 * Trata data de Nascimento do Usuario
	 * @return
	 * 		Data de Nascimento, tratada, do Usuario
	 * @throws
	 * 		Erro em data futura. Compara a data gerada com a data do Computador
	 */
	public static String dataNascimentoGrafico(int day, int month, int year) throws ExceptionData {
		
			
		String data = "";
		
		//Pega data do PC
		Calendar calendario = Calendar.getInstance();
		int dia = calendario.get(Calendar.DAY_OF_MONTH);
		int mes = calendario.get(Calendar.MONTH)+1;
		int ano = calendario.get(Calendar.YEAR);
		
		if (month == 4 || month == 6 || month == 9 || month == 11){
			if (day < 1 || day > 30){
				throw new ExceptionData ("Dia errado. Mes com 30 dias.");		//meses com 30 dias
			}
			
		} else if ((year % 4 == 0 && ( year % 400 == 0 || year % 100 != 0)) && month == 2)  {  //ano bissexto
			if (day < 1 || day > 29){
				throw new ExceptionData ("Dia errado. Fevereiro com 29 dias.");		//Fevereiro com 29 dias
			}
		} else if (month == 2){
			if (day < 1 || day > 28){
				throw new ExceptionData ("Dia errado. Fevereiro com 28 dias.");		//Fevereiro com 28 dias
			}	
		} else {
			if (day < 1 || day > 31){
				throw new ExceptionData ("Dia errado. Mes com 31 dias.");		//meses com 31 dias
			}
		}
		
		if (year == ano && month == mes && day > dia ){				//Verifica data futura
			throw new ExceptionData ("Erro. Data futura.");
		}
		
		data = day + "/" + month + "/" + year;
		
		return data;
	}
	
	
	
	/**
	 * Trata calendario dos Jogos da Copa
	 * @param month
	 * 		Mes do Jogo
	 * @param dayOfMonth
	 * 		Dia do Jogo
	 * @param hourOfDay
	 * 		Hora do jogo
	 * @param minuto
	 * 		Minutos do Jogo
	 * @return
	 * 		Calendario do jogo tratado
	 */
	public static Calendar calendarioJogoCopaGrafico(int month, int dayOfMonth, int hourOfDay, int minuto) throws Exception{
		//Por ser um projeto especifico para Copa de 2010. Os jogos sempre sao em 2010. Mes so pode escolher em 6 e 7 e de 11/06 - 11/07
	
		//Pega data do PC
		Calendar calendario = Calendar.getInstance();
		int dia = calendario.get(Calendar.DAY_OF_MONTH);
		int mes = calendario.get(Calendar.MONTH)+1;
		int hour = calendario.get(Calendar.HOUR_OF_DAY);
		int minute = calendario.get(Calendar.MINUTE);
		
		int year = 2010;
		
		
		if (month == 6 && dayOfMonth < 11){
			throw new Exception ("Erro. Copa não ocorre nesta data.");
			
		} else if (month == 7 && dayOfMonth > 11){
			throw new Exception ("Erro. Copa não ocorre nesta data.");
			
		} else 	if (month == mes && dayOfMonth > dia ){
			throw new Exception ("Erro. Data futura.");
			
		} else if (month == mes && dayOfMonth == dia && hourOfDay > hour){
			throw new Exception ("Erro. Data futura.");
			
		} else if (month == mes && dayOfMonth == dia && hourOfDay == hour && minuto > minute){
			throw new Exception ("Erro. Data futura.");
		}
			
		return new GregorianCalendar(year, month, dayOfMonth, hourOfDay, minuto);
			
	}	

	
	/**
	 * Checa seguranca (tamanho minimo: 4 digitos) da senha do Usuario
	 * @param senha
	 * 		Senha do Usuario
	 * @throws Exception
	 * 		Senha curta
	 */
	public static void checaSenha(String senha) throws ExceptionSenha {
		if (senha.length() < 4)
			throw new ExceptionSenha("Senha curta demais.");
	}
	
	/**
	 * Trata email do Usuario
	 * @param email
	 * 		email do usuario
	 * @return
	 * 		Email tratado
	 */
	public static void checaEmail(String emailAddress) throws ExceptionEmail {
		String expression = "^[\\w\\-]([\\.\\w])+[\\w]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";  
		CharSequence inputStr = emailAddress;  
		Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);  
		Matcher matcher = pattern.matcher(inputStr);  
		if (!matcher.matches())
			throw new ExceptionEmail("Email errado.");
	}
	
	
	/**
	 * Trata a naturalidade do Jogador
	 * @param naturalidade
	 * 		Naturalidade do Usuario
	 * @return
	 * 		Naturalidade tratada
	 */
	
	public static void checaNaturalidade(String naturalidade) throws ExceptionNaturalidade{
		if (naturalidade.length() < 3)
			throw new ExceptionNaturalidade("Naturalidade curta.");
		for (char c : naturalidade.replace(" ", "").toCharArray()) {
			if (!Character.isLetter(c))
				throw new ExceptionNaturalidade("Naturalidade com caractere inválido.");
		}
	}
	
	/**
	 * Checa gols dos Times.  
	 * @param gol
	 * 		Gol do Time
	 * @throws ExceptionGol
	 * 		Gol menor que 0
	 */
	public static void checaGol(String gol) throws ExceptionGol {
		int golInt = 0;
		
		try {
			golInt = Integer.parseInt(gol);
		} catch (Exception e) {
			throw new ExceptionGol("Quantidade de gols deve ser um numero inteiro.");
		}
		
		if (golInt < 0)
			throw new ExceptionGol("Quantidade de gols deve ser maior ou igual a zero.");
			
	}
	
	/**
	 * Mostra um tela solicitando senha do usuario
	 * @param msg
	 * 		Mensagem que aparecera na tela
	 * @return
	 * 		Senha com caracteres modificados por *
	 */
	@SuppressWarnings("deprecation")
	public static String password(String msg) {

		JPasswordField password = new JPasswordField(10);
		password.setEchoChar('*');

		JLabel rotulo = new JLabel(msg);

		JPanel entUsuario = new JPanel();
		entUsuario.add(rotulo);
		entUsuario.add(password);

		JOptionPane.showMessageDialog(null, entUsuario, "Bolão da Copa P2",
				JOptionPane.PLAIN_MESSAGE);

		return password.getText();

	}
	
	/**
	 * Mostra um tela solicitando senha do usuario
	 * @return
	 * 		Senha com caracteres modificados por *
	 */
	public static String password() {
		return password("Digite a senha: ");
	}
}
